Departamento de Física - Faculdade de Ciências e Tecnologia da Universidade de Coimbra

Física Computacional - Ficha 3 - Integração e Diferenciação Numérica

Rafael Isaque Santos - 2012144694 - Licenciatura em Física


In [1]:
from numpy import sin, cos, tan, pi, e, exp, log, copy, linspace
from numpy.polynomial.legendre import leggauss

In [2]:
n_list = [2, 4, 8, 10, 20, 30, 50, 100]

1 - Cálculo do integral $\int _{0}^{\pi} e^{x} \cos(x) \; dx$


In [3]:
f1 = lambda x: exp(x) * cos(x)
f1_sol = -(exp(pi) + 1) / 2

In [4]:
trapezios_simples = lambda f, a, b: (b-a)/2 * (f(a) + f(b))
simpson13_simples = lambda f, a, b: ((b-a)/3) * (f(a) + 4*f((a + b)/2) + f(b))
simpson38_simples = lambda f, a, b: (3/8)*(b-a) * (f(a) + 3*f((2*a + b)/3) + 3*f((a + 2*b)/3) + f(b))

In [5]:
def trapezios_composta(f, a, b, n):
    h = (b-a)/n
    xi = a
    s_int = 0
    for i in range(n):
        s_int += f(xi) + f(xi+h)
        xi += h
    s_int *= h/2
    return s_int


def simpson13_composta(f, a, b, n):
    h = (b-a)/n
    x = linspace(a, b, n+1)
    s_int = 0
    for i in range(0, n, 2):
        s_int += f(x[i]) + 4*f(x[i+1]) + f(x[i+2])
    s_int *= h/3
    return s_int

In [6]:
from sympy import oo            # símbolo 'infinito'

def gausslegendre(f, a, b, x_pts, w_pts):
    x_gl = copy(x_pts)
    w_gl = copy(w_pts)
    def gl_sum(f, x_list, w_list):
        s_int = 0
        for x, w in zip(x_list, w_list):
            s_int += w * f(x)
        return s_int
    if (a == -1 and b == 1): return gl_sum(f, x_gl, w_gl)
    elif (a == 0 and b == oo):
        x_inf = list(map(lambda x: tan( pi/4 * (1+x)), copy(x_pts)))
        w_inf = list(map(lambda w, x: pi/4 * w/(cos(pi/4 * (1+x)))**2, copy(w_pts), copy(x_pts)))
        return gl_sum(f, x_inf, w_inf)

    else:
        h = (b-a)/2
        xi = list(map(lambda x: h * (x + 1) + a, x_gl))
        return h * gl_sum(f, xi, w_gl)

In [7]:
def erro_rel(est, real):
    if real == 0: return abs((est-real)/(est+real)) * 100
    else: return abs((est-real)/real) * 100

def aval_simples(f, a, b, real_value):
    print('Utilizando os métodos:')
    trap_si = trapezios_simples(f, a, b)
    print('Trapézio Simples: ' + str(trap_si) + '   Erro Relativo: ' + str(erro_rel(trap_si, real_value)) + ' %')

    simps13_si = simpson13_simples(f, a, b)
    print('Simpson 1/3 Simples: ' + str(simps13_si) + '   Erro Relativo: ' + str(erro_rel(simps13_si, real_value)) + ' %')

    simps38_si =  simpson38_simples(f, a, b)
    print('Simpson 3/8 Simples: ' + str(simps38_si) + '   Erro Relativo: ' + str(erro_rel(simps38_si, real_value)) + ' %')

In [8]:
def aval_composta(f, a, b, n, x_n, w_n, real_value):
    print('Utilizando os métodos: [N = ' + str(n) + '] \n')

    trap_c = trapezios_composta(f, a, b, n)
    print('Trapézios Composta: ' + str(trap_c) + '   Erro Relativo: ' + str(erro_rel(trap_c, real_value)))

    simp_13_c = simpson13_composta(f, a, b, n)
    print('Simpson Composta: ' + str(simp_13_c) + '   Erro Relativo: ' + str(erro_rel(simp_13_c, real_value)))

    gaule_ab = gausslegendre(f, a, b, x_n, w_n)
    print('Gauss-Legendre: ' + str(gaule_ab) + '   Erro Relativo: ' + str(erro_rel(gaule_ab, real_value)))
    print('\n')

Integrando $e^{x} \cos (x)$


In [9]:
aval_simples(f1, 0, pi, f1_sol)


Utilizando os métodos:
Trapézio Simples: -34.7785186603   Erro Relativo: 188.131903996 %
Simpson 1/3 Simples: -23.1856791068   Erro Relativo: 92.087935997 %
Simpson 3/8 Simples: -35.3982912992   Erro Relativo: 193.266575551 %

In [10]:
for n in n_list:
    x_i, w_i = leggauss(n)
    aval_composta(f1, 0, pi, n, x_i, w_i, f1_sol)


Utilizando os métodos: [N = 2] 

Trapézios Composta: -17.3892593301   Erro Relativo: 44.0659519978
Simpson Composta: -11.5928395534   Erro Relativo: 3.9560320015
Gauss-Legendre: -12.3362104657   Erro Relativo: 2.20262237998


Utilizando os métodos: [N = 4] 

Trapézios Composta: -13.3360228474   Erro Relativo: 10.4858344393
Simpson Composta: -11.9849440198   Erro Relativo: 0.707538080238
Gauss-Legendre: -12.0701894903   Erro Relativo: 0.00129926756839


Utilizando os métodos: [N = 8] 

Trapézios Composta: -12.3821624298   Erro Relativo: 2.58332366937
Simpson Composta: -12.0642089572   Erro Relativo: 0.0508465872629
Gauss-Legendre: -12.0703463164   Erro Relativo: 3.31125784123e-12


Utilizando os métodos: [N = 10] 

Trapézios Composta: -12.2695456708   Erro Relativo: 1.65032012456
Simpson Composta: -12.0677961579   Erro Relativo: 0.0211274672189
Gauss-Legendre: -12.0703463164   Erro Relativo: 5.88668060663e-14


Utilizando os métodos: [N = 20] 

Trapézios Composta: -12.1200244031   Erro Relativo: 0.411571344833
Simpson Composta: -12.0701839805   Erro Relativo: 0.00134491507539
Gauss-Legendre: -12.0703463164   Erro Relativo: 1.47167015166e-13


Utilizando os métodos: [N = 30] 

Trapézios Composta: -12.0924154029   Erro Relativo: 0.182837227041
Simpson Composta: -12.070314144   Erro Relativo: 0.000266540935235
Gauss-Legendre: -12.0703463164   Erro Relativo: 5.44517956113e-13


Utilizando os métodos: [N = 50] 

Trapézios Composta: -12.0782893309   Erro Relativo: 0.0658060196321
Simpson Composta: -12.0703421398   Erro Relativo: 3.46017614829e-05
Gauss-Legendre: -12.0703463164   Erro Relativo: 7.94701881895e-13


Utilizando os métodos: [N = 100] 

Trapézios Composta: -12.0723318741   Erro Relativo: 0.0164498818044
Simpson Composta: -12.0703460552   Erro Relativo: 2.16413765411e-06
Gauss-Legendre: -12.0703463164   Erro Relativo: 8.68285389478e-13


Derivar $e^{x} \sin(x) + e^{-x} \cos(x)$ nos pontos:

x = 0, $\frac{\pi}{4}$, $\frac{\pi}{2}$, $\frac{3\pi}{4}$ e $\pi$.

Utilizando as fórmulas a 2, 3 e 5 pontos.

com passos h = 0.1, 0.05, 0.01


In [11]:
f2 = lambda x: exp(x)*sin(x) + exp(-x)*cos(x)
f2_sol = lambda x: (exp(x)-exp(-x)) * (sin(x) + cos(x))
x_2 = [0, pi/4, pi/2, 3*pi/4, pi]
h_2 = [0.1, 0.05, 0.01]

In [12]:
df_2pts = lambda f, x, h: (f(x+h) - f(x)) / h
df_3pts = lambda f, x, h: (-f(x + 2*h) + 4*f(x+h) - 3*f(x)) / (2*h)
df_5pts = lambda f, x, h: (-3*f(x+4*h) + 16*f(x+3*h) - 36*f(x+2*h) + 48*f(x+h) - 25*f(x)) / (12*h)

In [13]:
for x in x_2:
    print('\nDerivada de f(' + str(x) + ') :' )
    d_sol = f2_sol(x)
    print('Valor real = ' + str(d_sol))
    for h in h_2:
        print('com passo \'h\' = ' + str(h) + ' :')
        d2r = df_2pts(f2, x, h)
        print('Fórmula a 2 pontos: ' + str(d2r) + '   Erro relativo: ' + str(erro_rel(d2r, d_sol)))
        d3r = df_3pts(f2, x, h)
        print('Fórmula a 3 pontos: ' + str(d3r) + '   Erro relativo: ' + str(erro_rel(d3r, d_sol)))
        d5r = df_5pts(f2, x, h)
        print('Fórmula a 5 pontos: ' + str(d5r) + '   Erro relativo: ' + str(erro_rel(d5r, d_sol)))


Derivada de f(0) :
Valor real = 0.0
com passo 'h' = 0.1 :
Fórmula a 2 pontos: 0.106499885754   Erro relativo: 100.0
Fórmula a 3 pontos: -0.0123298081793   Erro relativo: 100.0
Fórmula a 5 pontos: 3.12839432937e-05   Erro relativo: 100.0
com passo 'h' = 0.05 :
Fórmula a 2 pontos: 0.0516458298118   Erro relativo: 100.0
Fórmula a 3 pontos: -0.00320822613034   Erro relativo: 100.0
Fórmula a 5 pontos: 9.08106774962e-07   Erro relativo: 100.0
com passo 'h' = 0.01 :
Fórmula a 2 pontos: 0.0100664999989   Erro relativo: 100.0
Fórmula a 3 pontos: -0.000132333299807   Erro relativo: 100.0
Fórmula a 5 pontos: 2.7154574885e-10   Erro relativo: 100.0

Derivada de f(0.7853981633974483) :
Valor real = 2.45697250995
com passo 'h' = 0.1 :
Fórmula a 2 pontos: 2.6439799125   Erro relativo: 7.61129405386
Fórmula a 3 pontos: 2.45896668342   Erro relativo: 0.0811638496186
Fórmula a 5 pontos: 2.45721835016   Erro relativo: 0.0100058186763
com passo 'h' = 0.05 :
Fórmula a 2 pontos: 2.55059697185   Erro relativo: 3.8105620442
Fórmula a 3 pontos: 2.45721403119   Erro relativo: 0.00983003453626
Fórmula a 5 pontos: 2.45698635082   Erro relativo: 0.000563330366577
com passo 'h' = 0.01 :
Fórmula a 2 pontos: 2.4757049983   Erro relativo: 0.762421568756
Fórmula a 3 pontos: 2.45697439475   Erro relativo: 7.67126415343e-05
Fórmula a 5 pontos: 2.4569725301   Erro relativo: 8.20336622862e-07

Derivada de f(1.5707963267948966) :
Valor real = 4.60259780461
com passo 'h' = 0.1 :
Fórmula a 2 pontos: 4.60584080256   Erro relativo: 0.070460163724
Fórmula a 3 pontos: 4.64107895744   Erro relativo: 0.836074635551
Fórmula a 5 pontos: 4.60295744316   Erro relativo: 0.00781381642996
com passo 'h' = 0.05 :
Fórmula a 2 pontos: 4.60870864155   Erro relativo: 0.132769301093
Fórmula a 3 pontos: 4.61157648054   Erro relativo: 0.195078438462
Fórmula a 5 pontos: 4.60262078382   Erro relativo: 0.00049926604818
com passo 'h' = 0.01 :
Fórmula a 2 pontos: 4.60450851853   Erro relativo: 0.0415138145618
Fórmula a 3 pontos: 4.60293719371   Erro relativo: 0.00737385944989
Fórmula a 5 pontos: 4.60259784148   Erro relativo: 8.00938862976e-07

Derivada de f(2.356194490192345) :
Valor real = 1.16084296057e-15
com passo 'h' = 0.1 :
Fórmula a 2 pontos: -0.790761667598   Erro relativo: 6.8119607428e+16
Fórmula a 3 pontos: 0.107734082419   Erro relativo: 9.28067672185e+15
Fórmula a 5 pontos: -0.000236889565646   Erro relativo: 2.0406684943e+13
com passo 'h' = 0.05 :
Fórmula a 2 pontos: -0.382373291663   Erro relativo: 3.29392781496e+16
Fórmula a 3 pontos: 0.0260150842714   Erro relativo: 2.24105112879e+15
Fórmula a 5 pontos: -6.76293879565e-06   Erro relativo: 582588603842.0
com passo 'h' = 0.01 :
Fórmula a 2 pontos: -0.0744377541176   Erro relativo: 6.4123879496e+15
Fórmula a 3 pontos: 0.00101106099155   Erro relativo: 8.7097137674e+13
Fórmula a 5 pontos: -2.00894116157e-09   Erro relativo: 173058922.752

Derivada de f(3.141592653589793) :
Valor real = -23.0974787145
com passo 'h' = 0.1 :
Fórmula a 2 pontos: -25.4887408644   Erro relativo: 10.3529141836
Fórmula a 3 pontos: -22.9441198481   Erro relativo: 0.663963665992
Fórmula a 5 pontos: -23.100000536   Erro relativo: 0.0109181677508
com passo 'h' = 0.05 :
Fórmula a 2 pontos: -24.2738274751   Erro relativo: 5.09297475761
Fórmula a 3 pontos: -23.0589140858   Erro relativo: 0.166964668377
Fórmula a 5 pontos: -23.097614381   Erro relativo: 0.000587364920494
com passo 'h' = 0.01 :
Fórmula a 2 pontos: -23.3296584228   Erro relativo: 1.00521667821
Fórmula a 3 pontos: -23.0959332725   Erro relativo: 0.00669095538265
Fórmula a 5 pontos: -23.0974789055   Erro relativo: 8.26952993199e-07

Calcular o integral:

$\int _{0}^{\infty} \frac{x dx}{(1+x)^{4}}$


In [14]:
xi, wi = leggauss(100)

In [15]:
f3 = lambda x: x / (1+x)**4
gausslegendre(f3, 0, oo, xi, wi)


Out[15]:
0.16666666666666732

Usando as transformações

$x = \frac{y}{1-y}$

$x = \tan \left[ \frac{\pi}{4} (1+y) \right]$

Integral Duplo de

$\int _{0}^{1} \left( \int _{-\sqrt{1-y^{2}}} ^{\sqrt{1-y^{2}}} \, dx \right) dy$


In [16]:
gausslegendre((lambda y: gausslegendre((lambda x: 1), -(1-y**2)**(1/2), (1-y**2)**(1/2) , xi, wi)), 0, 1, xi, wi)


Out[16]:
1.5707966136937224

Integral Duplo de

$\int _{0}^{1} \left( \int _{-\sqrt{1-y^{2}}} ^{\sqrt{1-y^{2}}} e^{-xy} \, dx \right) dy$


In [17]:
gausslegendre((lambda y: gausslegendre(lambda x: e**(-x*y), -(1-y**2)**(1/2), (1-y**2)**(1/2), xi, wi)), 0, 1, xi, wi)


Out[17]:
1.6038298597579663